package com.edu.exam.entity.examination.control;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;
import com.edu.exam.enums.quality.monitoring.MonitoringTaskStatus;
import com.edu.exam.enums.examination.MonitoringLevel;
import com.edu.exam.enums.examination.MonitoringRiskLevel;

/**
 * 监控任务实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：monitoring_task
 *
 * <p>监控任务实体用于管理安全监控任务的信息，包括任务配置、
 * 状态管理、风险评估、事件统计等。确保安全监控任务的完整生命周期管理。</p>
 *
 * <p>核心功能：
 * - 任务生命周期管理：管理监控任务从创建到完成的全过程
 * - 状态跟踪：实时跟踪任务执行状态和进度
 * - 风险评估：计算和更新任务的总体风险评分
 * - 事件统计：统计监控过程中的各类事件数量
 * - 配置管理：管理监控任务的配置参数</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Accessors(chain = true)
public class MonitoringTask {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 任务ID
     *
     * <p>监控任务的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "task_id", nullable = false, length = 32, unique = true)
    private String taskId;

    /**
     * 考试会话ID
     *
     * <p>关联的考试会话ID。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 考试计划ID
     *
     * <p>关联的考试计划ID。</p>
     */
    @Column(name = "exam_plan_id", nullable = false, length = 32)
    private String examPlanId;

    /**
     * 任务名称
     *
     * <p>监控任务的显示名称。</p>
     */
    @Column(name = "task_name", nullable = false, length = 100)
    private String taskName;

    /**
     * 任务状态
     *
     * <p>监控任务的执行状态。
     * 支持的状态：CREATED（已创建）、RUNNING（运行中）、PAUSED（已暂停）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "task_status", nullable = false, length = 20)
    private MonitoringTaskStatus taskStatus = MonitoringTaskStatus.CREATED;

    /**
     * 监控级别
     *
     * <p>监控任务的级别。
     * 支持的级别：LOW（低）、MEDIUM（中）、HIGH（高）、CRITICAL（关键）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "monitoring_level", nullable = false, length = 20)
    private MonitoringLevel monitoringLevel = MonitoringLevel.MEDIUM;

    /**
     * 开始时间
     *
     * <p>监控任务开始执行的时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>监控任务结束的时间。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 总事件数
     *
     * <p>监控过程中检测到的总事件数量。</p>
     */
    @Column(name = "total_events", nullable = false)
    private Integer totalEvents = 0;

    /**
     * 总体风险评分
     *
     * <p>监控任务的总体风险评分，范围0-100。</p>
     */
    @Column(name = "overall_risk_score", precision = 5, scale = 2)
    private Float overallRiskScore = 0.0f;

    /**
     * 风险级别
     *
     * <p>基于风险评分确定的风险级别。
     * 支持的级别：LOW（低）、MEDIUM（中）、HIGH（高）、CRITICAL（关键）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "risk_level", nullable = false, length = 10)
    private MonitoringRiskLevel riskLevel = MonitoringRiskLevel.LOW;

    /**
     * 高风险事件数
     *
     * <p>检测到的高风险事件数量。</p>
     */
    @Column(name = "high_risk_events")
    private Integer highRiskEvents = 0;

    /**
     * 中风险事件数
     *
     * <p>检测到的中风险事件数量。</p>
     */
    @Column(name = "medium_risk_events")
    private Integer mediumRiskEvents = 0;

    /**
     * 低风险事件数
     *
     * <p>检测到的低风险事件数量。</p>
     */
    @Column(name = "low_risk_events")
    private Integer lowRiskEvents = 0;

    /**
     * 异常检测数
     *
     * <p>检测到的异常数量。</p>
     */
    @Column(name = "anomaly_count")
    private Integer anomalyCount = 0;

    /**
     * 警报触发数
     *
     * <p>触发的警报数量。</p>
     */
    @Column(name = "alert_count")
    private Integer alertCount = 0;

    /**
     * 创建者ID
     *
     * <p>创建监控任务的操作者ID。</p>
     */
    @Column(name = "creator_id", nullable = false, length = 32)
    private String creatorId;

    /**
     * 监控配置
     *
     * <p>JSON格式的监控配置参数。</p>
     */
    @Column(name = "monitoring_config", columnDefinition = "TEXT")
    private String monitoringConfig;

    /**
     * 任务描述
     *
     * <p>监控任务的详细描述。</p>
     */
    @Column(name = "task_description", length = 500)
    private String taskDescription;

    /**
     * 监控标签
     *
     * <p>JSON格式的监控标签。</p>
     */
    @Column(name = "monitoring_tags", columnDefinition = "TEXT")
    private String monitoringTags;

    /**
     * 任务备注
     *
     * <p>监控任务的备注信息。</p>
     */
    @Column(name = "task_notes", columnDefinition = "TEXT")
    private String taskNotes;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 版本号
     */
    @Version
    @Column(name = "version", nullable = false)
    @Builder.Default
    private Integer version = 0;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    @Builder.Default
    private Boolean isDeleted = false;

}